export const on = ({el, type, fn}) => {
  if (typeof window) {
    if (window.addEventListener) {
      el.addEventListener(type, fn, false)
    } else {
      el.attachEvent(`on${type}`, fn)
    }
  }
}
export const off = ({el, type, fn}) => {
  if (typeof window) {
    if (window.addEventListener) {
      el.removeEventListener(type, fn)
    } else {
      el.detachEvent(`on${type}`, fn)
    }
  }
}
export const once = ({el, type, fn}) => {
  const hyFn = (event) => {
    try {
      fn(event)
    }
    finally {
      off({el, type, fn: hyFn})
    }
  }
  on({el, type, fn: hyFn})
}
// 最后一个
export const fbTwice = ({fn, time = 300}) => {
  let [cTime, k] = [null, null]
  // 获取当前时间
  const getTime = () => new Date().getTime()
  // 混合函数
  const hyFn = () => {
    const ags = argments
    return () => {
      clearTimeout(k)
      k = cTime = null
      fn(...ags)
    }
  }
  return () => {
    if (cTime == null) {
      k = setTimeout(hyFn(...arguments), time)
      cTime = getTime()
    } else {
      if ( getTime() - cTime < 0) {
        // 清除之前的函数堆 ---- 重新记录
        clearTimeout(k)
        k = null
        cTime = getTime()
        k = setTimeout(hyFn(...arguments), time)
      }
    }}
}
export const contains = function(parentNode, childNode) {
  if (parentNode.contains) {
    return parentNode != childNode && parentNode.contains(childNode)
  } else {
    return !!(parentNode.compareDocumentPosition(childNode) & 16)
  }
}
export const addClass = function (el, className) {
  if (typeof el !== "object") {
    console.log('el is not elem')
    return null
  }
  let classList = el['className']
  classList = classList === '' ? [] : classList.split(/\s+/)
  if (classList.indexOf(className) === -1) {
    classList.push(className)
    el.className = classList.join(' ')
  } else {
    console.warn('warn className current')
  }
}
export const removeClass = function (el, className) {
  let classList = el['className']
  classList = classList === '' ? [] : classList.split(/\s+/)
  classList = classList.filter(item => {
    return item !== className
  })
  el.className =   classList.join(' ')
}
export const delay = ({fn, time}) => {
  let oT = null
  let k = null
  return () => {
    // 当前时间
    let cT = new Date().getTime()
    const fixFn = () => {
      k = oT = null
      fn()
    }
    if (k === null) {
      oT = cT
      k = setTimeout(fixFn, time)
      return
    }
    if (cT - oT < time) {
      oT = cT
      clearTimeout(k)
      k = setTimeout(fixFn, time)
    }

  }
}
export const Event = function () {
  // 类型
  this.typeList = {}
}
Event.prototype.on = function ({type, fn}){
  if (this.typeList.hasOwnProperty(type)) {
    this.typeList[type].push(fn)
  } else {
    this.typeList[type] = []
    this.typeList[type].push(fn)
  }
}
Event.prototype.off = function({type, fn}) {
  if (this.typeList.hasOwnProperty(type)) {
    let list = this.typeList[type]
    let index = list.indexOf(fn)
    if (index !== -1 ) {
      list.splice(index, 1)
    }
  } else {
    console.warn('not has this type')
  }
}
Event.prototype.once = function ({type, fn}) {
  const fixFn = () => {
    fn()
    this.off({type, fn: fixFn})
  }
  this.on({type, fn: fixFn})
}
Event.prototype.trigger = function (type){
  if (this.typeList.hasOwnProperty(type)) {
    this.typeList[type].forEach(fn => {
      fn()
    })
  }
}
